Suite SDK Images Basic

Getting started

In [3]:
import spb.sdk
print(f'This guide was made with this version: v{spb.sdk.__version__}')
This guide was made with this version: v0.2.10

Create Project

  • Creating project is currently supported only with Web UI
  • In this project, we'll create a project with image categorization and 2 object classes (person: bounding box, car: polygon)

Get project in SDK

In [4]:
client = spb.sdk.Client(project_name='SDK Test Project')

# Print project information
print('Project Name: {}'.format(client.get_project_name()))
print('Total number of data: {}'.format(client.get_num_data()))
Project Name: SDK Test Project
[WARNING] Data list is empty
Total number of data: 0

Upload Images

  • Sample images are from coco-dataset
  • Make sure to prepare images. Check README
In [5]:
IMAGE_DIR = 'coco-sample/*.jpg' # Set proper image path for your usage
DATASET = 'coco-sample' # Set proper dataset name you want

import glob
import os
for image_path in glob.glob(IMAGE_DIR):
    image_name = os.path.basename(image_path)
    # Without key, upload_image function will use file name for data key as default
    # (dataset, data key) pair must be unique
    client.upload_image(image_path, DATASET, key=image_name)

Check uploaded Images


  • code below shows how to check uploaded images using SDK!
In [6]:
# Iterate all data in dataset
def get_data(dataset, page_size=10):
    num_data = client.get_num_data(dataset=dataset)
    print(f'# of images in {DATASET}: {num_data}')
    num_page = (num_data + page_size - 1) // page_size
    for page_idx in range(num_page):
        for data_handler in client.get_data_page(page_idx=page_idx, page_size=page_size, dataset=dataset):
            yield data_handler

uploaded_data = {}
for data_handler in get_data(DATASET):
    dataset = data_handler.get_dataset_name()
    data_key = data_handler.get_key()
    uploaded_data[(dataset, data_key)] = data_handler
print(list(uploaded_data.keys()))
# of images in coco-sample: 3
[('coco-sample', '1.jpg'), ('coco-sample', '3.jpg'), ('coco-sample', '2.jpg')]
  • Or you can specify dataset and key to retrieve data
In [7]:
try:
    data_handler = next(client.get_data_page(page_idx=0, page_size=1, dataset=DATASET, data_key='3.jpg'))
except StopIteration:
    print('Data with this key does not exist')
else:
    print(f'Successfully retrieved ({data_handler.get_dataset_name()}, {data_handler.get_key()})')
Successfully retrieved (coco-sample, 3.jpg)

Update annotations

  • How to set annotations for images?
In [8]:
# 3.jpg annotation sample
# you can get data_handler by iterating data lists or just specifying dataset & key like shown above
data_handler = uploaded_data[(DATASET, '3.jpg')]

# For categories, use list of category names
category = ['clear']

# For objects, box and polygon looks like below.
# For more example, please refer to https://docs.superb-ai.com/user-manual/manipulate-labels/export-result-format#annotations
objects = [
    {
        "id": 1,
        "class": "Person",
        "shape": {
            "box": {
                "x": 56.2,
                "y": 201.7,
                "width": 58.4,
                "height": 119.5
            }
        },
        "properties": [
            {
                "name": "Occluded",
                "value": "No" # single value for multiple choice property (single answer, like radio)
            },
            {
                "name": "Accessaries",
                "value": [
                    "handbag" # list of values for multiple selection property (like checkbox)
                ]
            }
        ]
    },
    {
        "id": 2,
        "class": "Car",
        "shape": {
            "polygon": [
                {
                    "x": 266.3,
                    "y": 201.3
                },
                {
                    "x": 258.4,
                    "y": 209.7
                },
                {
                    "x": 251.7,
                    "y": 209.7
                },
                {
                    "x": 250.4,
                    "y": 228.3
                },
                {
                    "x": 282.3,
                    "y": 224.7
                },
                {
                    "x": 306.6,
                    "y": 224.3
                },
                {
                    "x": 307.0,
                    "y": 206.1
                },
                {
                    "x": 299.9,
                    "y": 197.3
                }
            ]
        },
        "properties": [
            {
                "name": "Number",
                "value": "N/A" # simple, string for free response
            }
        ]
    }
]
data_handler.set_category_labels(category)
data_handler.set_object_labels(objects)
  • You can check uploaded annotations visually via Suite Web

  • Or you can also check annotations using SDK data handler!!!

In [9]:
print(data_handler.get_category_labels())
print([data['class'] for data in data_handler.get_object_labels()])
['clear']
['Person', 'Car']

Download Images

In [10]:
images = {}
for data_handler in get_data(DATASET):
    dataset = data_handler.get_dataset_name()
    data_key = data_handler.get_key()
    images[(dataset, data_key)] = data_handler

import random
from PIL import Image
from IPython.display import display
import requests
data_handler = random.choice(list(images.values()))
print(data_handler.get_key())
image_url = data_handler.get_image_url()
img = Image.open(requests.get(image_url, stream=True).raw)
display(img)
# of images in coco-sample: 3
3.jpg